/**
 * PPH系统生产环境PM2配置文件
 * 
 * 🎯 生产级特性：
 * - 支持服务器断电重启
 * - 支持崩溃重启
 * - 支持错误重启
 * - 智能重启策略
 * - 完整日志管理
 * - 性能监控
 * 
 * 使用方法：
 * 1. 启动服务: pm2 start ecosystem.config.cjs --env production
 * 2. 查看状态: pm2 status
 * 3. 查看日志: pm2 logs
 * 4. 重启服务: pm2 restart all
 * 5. 停止服务: pm2 stop all
 */

const path = require('path');

module.exports = {
  apps: [
    {
      name: 'pph-backend',
      script: '../app/backend/server-simple.cjs',
      cwd: __dirname,
      instances: 1,
      exec_mode: 'fork',
      
      // 🔄 增强的自动重启配置
      autorestart: true,
      max_restarts: 15,        // 增加最大重启次数
      min_uptime: '30s',       // 增加最小运行时间
      max_memory_restart: '800M', // 增加内存限制
      
      // 📊 监控配置
      watch: false,
      ignore_watch: ['node_modules', 'logs', 'data', 'uploads'],

      // 🔒 进程配置
      detached: false,
      windowsHide: true,
      silent: false,
      
      // 🌍 生产环境变量
      env_production: {
        NODE_ENV: 'production',
        PORT: 3011,
        DB_PATH: './app/backend/data/pph.sqlite',
        LOG_LEVEL: 'info',
        MAX_CONNECTIONS: 50,
        BACKUP_ENABLED: 'true',
        BACKUP_INTERVAL: '6h',

        // 🧠 内存优化配置
        NODE_OPTIONS: '--max-old-space-size=1024',
        UV_THREADPOOL_SIZE: 4,

        // 第三方代理相关（默认指向生产地址，若无外网也不影响主流程）
        LENOVO_DSP_BASE_URL: 'https://dsp.lenovo.com.cn',
        DSP_PROXY_TIMEOUT_MS: '8000',

        // 🗑️ 自动清理配置
        AUTO_CLEANUP_ENABLED: 'true',
        CLEANUP_INTERVAL: '1h',
        MEMORY_CLEANUP_THRESHOLD: '600M',
        LOG_CLEANUP_DAYS: 7,
        TEMP_CLEANUP_ENABLED: 'true'
      },
      
      // 📝 日志配置
      log_file: '../app/logs/pph-backend-combined.log',
      out_file: '../app/logs/pph-backend-out.log',
      error_file: '../app/logs/pph-backend-error.log',
      log_date_format: 'YYYY-MM-DD HH:mm:ss Z',
      merge_logs: true,
      log_type: 'json',
      
      // 🚀 启动配置
      wait_ready: false,
      listen_timeout: 15000,   // 增加启动超时时间
      kill_timeout: 8000,      // 增加停止超时时间
      
      // 💀 异常处理
      restart_delay: 5000,     // 重启延迟
      exp_backoff_restart_delay: 200,
      
      // 🔍 健康检查
      health_check_grace_period: 5000,
      
      // 🛡️ 错误处理
      combine_logs: true,
      
      // 📈 性能监控
      pmx: true,
      monitoring: true
    },
    
    {
      name: 'pph-frontend',
      script: '../app/frontend/static-server.cjs',
      cwd: __dirname,
      instances: 1,
      exec_mode: 'fork',
      
      // 🔄 自动重启配置
      autorestart: true,
      max_restarts: 10,
      min_uptime: '60s',       // 前端需要更长启动时间
      max_memory_restart: '500M',
      
      // 📊 监控配置
      watch: false,
      ignore_watch: ['node_modules', 'dist', 'logs'],

      // 🔒 进程配置
      detached: false,
      windowsHide: true,
      silent: false,
      
      // 🌍 生产环境变量
      env_production: {
        NODE_ENV: 'production',
        PORT: 3010,
        VITE_API_BASE_URL: 'http://localhost:3011/api',
        STATIC_DIR: 'dist'
      },
      
      // 📝 日志配置
      log_file: '../app/logs/pph-frontend-combined.log',
      out_file: '../app/logs/pph-frontend-out.log',
      error_file: '../app/logs/pph-frontend-error.log',
      log_date_format: 'YYYY-MM-DD HH:mm:ss Z',
      merge_logs: true,
      
      // 🚀 启动配置
      wait_ready: false,
      listen_timeout: 45000,   // 前端构建需要更长时间
      kill_timeout: 8000,
      
      // 💀 异常处理
      restart_delay: 8000,     // 前端重启延迟更长
      exp_backoff_restart_delay: 200
    },

    {
      name: 'pph-management',
      script: '../management/server.js',
      cwd: __dirname,
      instances: 1,
      exec_mode: 'fork',

      // 🔄 自动重启配置
      autorestart: true,
      max_restarts: 8,
      min_uptime: '30s',
      max_memory_restart: '300M',

      // 📊 监控配置
      watch: false,

      // 🔒 进程配置
      detached: false,
      windowsHide: true,
      silent: false,

      // 🌍 环境变量
      env_production: {
        NODE_ENV: 'production',
        PORT: 3012,
        MANAGEMENT_MODE: 'true',
        API_BASE_URL: 'http://localhost:3011/api'
      },

      // 📝 日志配置
      log_file: '../app/logs/pph-management-combined.log',
      out_file: '../app/logs/pph-management-out.log',
      error_file: '../app/logs/pph-management-error.log',
      log_date_format: 'YYYY-MM-DD HH:mm:ss Z',
      merge_logs: true,

      // 🚀 启动配置
      wait_ready: false,
      listen_timeout: 20000,
      kill_timeout: 5000,

      // 💀 异常处理
      restart_delay: 3000,
      exp_backoff_restart_delay: 100
    },

    {
      name: 'pph-memory-optimizer',
      script: './scripts/memory-optimizer.cjs',
      node_args: ['--expose-gc'],
      interpreter_args: ['--expose-gc'],
      stop_exit_codes: [0],
      cwd: path.join(__dirname, '..'),
      instances: 1,
      exec_mode: 'fork',

      // 🔄 自动重启配置
      autorestart: true,
      max_restarts: 10,
      min_uptime: '5s',
      max_memory_restart: '200M',

      // 📊 监控配置
      watch: false,

      // 🔒 进程配置
      detached: false,
      windowsHide: true,
      silent: false,

      // 🌍 环境变量
      env_production: {
        NODE_ENV: 'production',
        NODE_OPTIONS: '--max-old-space-size=512'
      },

      // 📝 日志配置
      log_file: './app/logs/pph-memory-optimizer-combined.log',
      out_file: './app/logs/pph-memory-optimizer-out.log',
      error_file: './app/logs/pph-memory-optimizer-error.log',
      log_date_format: 'YYYY-MM-DD HH:mm:ss Z',
      merge_logs: true,

      // 🚀 启动配置
      wait_ready: false,
      listen_timeout: 10000,
      kill_timeout: 5000,

      // 💀 异常处理
      restart_delay: 60000,
      exp_backoff_restart_delay: 200
    }
  ],

  // 📊 部署配置
  deploy: {
    production: {
      user: 'administrator',
      host: ['localhost'],
      ref: 'origin/main',
      repo: 'local',
      path: 'D:\\PPH-Production',
      'post-deploy': 'npm install && npm run build:frontend && pm2 reload ecosystem.config.cjs --env production',
      'pre-setup': 'echo "Setting up production environment"'
    }
  }
};
